Skip to main content

04.Go Map

Table of Contents

Map

map 是一组无序的键值对的集合
map 是引用类型, 赋值时传递的是地址

map 初始化

map 只声明不初始化取零值 nil, nil map 只能读不能写入
map 初始化未添加值是 empty map, empty map 不等于 nil map

map[<key type>]<value type>                      // map 类型

var strMap = make(map[string]string, 1) // 声明并初始化一个 empty map, map 容量为 2
strMap["a"] = "a" // 已初始化的 map 赋值
strMap["b"] = "b"

intMap := map[string]int { // intMap 声明并初始化, 并赋值
"one": 1,
"two": 2,
}

Printf("int map %#v\n", intMap)
Printf("str map %#v\n", strMap)
Printf("str map length %v\n", len(strMap))

> int map map[string]int{"one":1, "two":2}
> str map map[string]string{"a":"a", "b":"b"} // map 可添加数据, 允许超过容量
> str map length 3 // 无法使用 cap 查看 map 容量, 可以使用 len 查看长度

map 传递

map 将引用拷贝了一份给赋值变量, 两个引用指向同一个数据
map 作为函数参数传递时也是拷贝一份引用进入函数

intMap := map[string]int {
"1st": 1,
}

copyMap := intMap // map 是引用类型, 传递的是引用并非数据的拷贝
copyMap["2nd"] = 2
intMap["1st"] = 4

Printf("intMap %#v\n", intMap)
Printf("copyMap %#v\n", copyMap)

> intMap map[string]int{"1st":4, "2nd":2} // 任意一个变量修改数据, 两个变量都会同步修改
> copyMap map[string]int{"1st":4, "2nd":2} // 两个变量指向同一个值, 结果一致

map 遍历

map 使用 range 遍历 map
map 值拷贝也需要使用 range 遍历, copy 只适用于切片

intMap := map[string]int {
"1st": 1,
"2nd": 2,
"3rd": 3,
}

copyMap := make(map[string]int, 3)

for key, value := range intMap {
copyMap[key] = value
Printf("%v: %v \n", key, value)
}

> 1st: 1
> 2nd: 2
> 3rd: 3

map 取值

map 使用 [key] 取值

 intMap := map[string]int {
"1st": 1,
"2nd": 2,
}

value, ok := intMap["3rd"] // map 取值

if ok == true { // ok 为 true, valUe 为对应 key 的值
Printf("value: %v\n", value)
}

if ok == false { // ok 为 false, map 不存在 key, value 为类型零值
Printf("key not in map")
}

map 删除

 intMap := map[string]int{
"1st": 1,
"2nd": 2,
}

delete(intMap, "1st")